﻿
using FreeSql;
using System;
using System.Data;
using System.IO;

namespace KJSyncXP.Access.Context
{
    /// <summary>
    /// FreeSQL 适配的 Access 上下文（支持 .NET Framework 4.0，可释放）
    /// </summary>
    public class AccessDbContext2 : IDisposable
    {
        // FreeSQL 核心实例（管理 Access 连接与操作）
        private IFreeSql _freeSql;
        // 标记是否已释放
        private bool _disposed = false;

        /// <summary>
        /// 构造函数（接收连接字符串，初始化 FreeSQL）
        /// </summary>
        public AccessDbContext2(string accessConnString)
        {
            if (string.IsNullOrEmpty(accessConnString))
                throw new ArgumentNullException("accessConnString", "Access 连接字符串不能为空");

            // 初始化 FreeSQL：指定数据库类型为 OleDb（Access 依赖 OLE DB 驱动）
            _freeSql = new FreeSqlBuilder()
                .UseConnectionString(DataType.MsAccess, accessConnString) // DataType.OleDb 适配 Access
                .UseAutoSyncStructure(false) // Access 不支持自动建表，禁用结构同步
                .UseNoneCommandParameter(true) // 适配 Access 对参数的兼容（避免语法错误）
                .Build();
        }


        /// <summary>
        /// 对外提供 FreeSQL 实例（用于 CRUD 操作）
        /// </summary>
        public IFreeSql Db => _freeSql;

        /// <summary>
        /// 释放资源（手动调用或 using 自动调用）
        /// </summary>
        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }


        /// <summary>
        /// 实际释放逻辑（释放 FreeSQL 连接资源，适配 3.0+ 版本）
        /// </summary>
        protected virtual void Dispose(bool disposing)
        {
            if (_disposed) return;

            // 释放托管资源：FreeSQL 3.0+ 已实现 IDisposable，直接调用 Dispose 即可
            if (disposing && _freeSql != null)
            {
                _freeSql.Dispose(); // 内部自动关闭底层 OleDbConnection + 释放连接池资源
                _freeSql = null;    // 置空避免重复释放
            }

            _disposed = true; // 标记已释放，防止重复调用
        }


        /// <summary>
        /// 析构函数（防止忘记手动释放）
        /// </summary>
        ~AccessDbContext2()
        {
            Dispose(false);
        }
    }
}